# matplotlib 绘图
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
# 设置相机参数：实际项目中要考虑将像素点换算成米等距离单位
F = 100  # 焦距为100像素
B = 10  # 两个相机的距离为10像素
# 成像位置默认为0
left_x = 0
right_x = 0

# 创建主窗口
root = tk.Tk()
root.title("双目成像原理")

# 创建画布
fig, axes = plt.subplots(1, 2, figsize=(6, 3))
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack()

# 添加像素点
def add(event):
    global left_x, right_x
    x = int(event.xdata)
    y = int(event.ydata)
    if event.inaxes == axes[0]:  # 判断点击的是否是左视图
        left_x = x
        axes[0].plot(x, y, 'ro', markersize=2)
        axes[0].figure.canvas.draw_idle()
    elif event.inaxes == axes[1]:  # 判断点击的是否是右视图
        right_x = x
        axes[1].plot(x, y, 'ro', markersize=2)
        axes[1].figure.canvas.draw_idle()

# 绑定点击事件
axes[0].set_title('左视图')
axes[0].set_xlim(0, 100)
axes[0].set_ylim(0, 100)
axes[0].set_aspect('equal')
axes[0].set_xticks([])
axes[0].set_yticks([])

axes[1].set_title('右视图')
axes[1].set_xlim(0, 100)
axes[1].set_ylim(0, 100)
axes[1].set_aspect('equal')
axes[1].set_xticks([])
axes[1].set_yticks([])

# 统一绑定点击事件
fig.canvas.mpl_connect('button_press_event', add)

# 根据两张图片中像素点的位移计算物体距离
def show_eye():
    if left_x == right_x:
        tk.messagebox.showwarning("警告", "左右视图成像点相同，无法计算距离。")
        return
    R = (F * B) / abs(left_x - right_x)
    tk.messagebox.showinfo("计算结果", f'预计距离为：{R} 像素')

# 创建计算距离按钮
button = tk.Button(root, text="计算距离", command=show_eye)
button.pack()

# 运行主循环
root.mainloop()